//
//  PhotoBrowerCell.swift
//  SinaWeiBoProject
//
//  Created by 房城鸿 on 15/10/21.
//  Copyright © 2015年 房兰峰. All rights reserved.
//
import UIKit
import SDWebImage
import SVProgressHUD

class PhotoBrowerCell: UICollectionViewCell {


    
    /// 图像的 URL
    var urls:NSURL?{
        didSet{
            
            //重置缩放的尺寸
            self.resetScrollView()
            
            //打开指示器
            indicator.startAnimating()
            
            imageView.image = nil

            // 提问： 对于SDWebImage,如果设置了  imageURL,图片会出现重用吗？  
            // 原因： sdwebimage 一旦设置了 url和之前的 url 不一致，会将 image 设置为 nil
            // dispatch_time  从什么时候开始，持续多久
            
            // 不想设置延时时间，可以   ---》 0 * NSEC_PER_SEC
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0 * NSEC_PER_SEC)), dispatch_get_main_queue()) {
                /**
                之前iamgeView 并没有指定大小，所以用之前的方法不可以   imageView.sd_setImageWithURL(urls)
                * RetryFailed 可以允许失败后重试
                * RefreshCached  如果服务器的图像变化，而本地的图像是之前的图像，使用此选项，会更新服务器的图片
                
                GET 方法能够缓存，如果服务器返回的状态码  是 304，表示内容没有变化
                提交请求，如果是 304，就使用本地缓存，否则使用服务器返回的图片
                */
                self.imageView.sd_setImageWithURL(self.urls, placeholderImage: nil, options: [SDWebImageOptions.RetryFailed]) { (image, error, _, _) in
                    
                    //关闭指示器
                    self.indicator.stopAnimating()
                    if error != nil{
                        SVProgressHUD.showErrorWithStatus("您的网络不给力")
                    }
                    self.setImagePosition()
                }
            }
        }
    }
    
    //重置 scrollview 的内容属性，因为缩放会影响到内容属性
    private func resetScrollView(){
        scrollerView.contentSize = CGSizeZero
        scrollerView.contentOffset = CGPointZero
        scrollerView.contentInset = UIEdgeInsetsZero
    }
    
    ///  长短图计算
    /**
    如果图像缩放之后，没有屏幕高，显示在中间
    否则，显示在顶部，并且设置 contentSzie 允许滚动
    */
    private func setImagePosition(){
    
        let size = displaySize(imageView.image!)
        imageView.frame = CGRect(origin: CGPointZero, size: size)
        
        if size.height < scrollerView.bounds.height {
            let y = (scrollerView.bounds.height - size.height) * 0.5
            
            //设置边距的最大好处，缩放之后，能够自动调整 contentSize ,能够保证滚动看到边界
            scrollerView.contentInset = UIEdgeInsets(top: y, left: 0, bottom: 0, right: 0)
//            imageView.frame = CGRect(x: 0, y: y, width: size.width, height: size.height)
        }else{
            scrollerView.contentSize = size
        }
    }
    
    private func displaySize(image:UIImage) ->CGSize{
        //图像的宽高比
        let scale = image.size.height / image.size.width
        //计算高度
        let w = scrollerView.bounds.width
        let h = w * scale
        return CGSize(width: w, height: h)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI(){
        
        //1. 加载控件
        contentView.addSubview(scrollerView)
        scrollerView.addSubview(imageView)
        contentView.addSubview(indicator)
        
        //2. 布局
        var rect = bounds
        rect.size.width -= 20
        scrollerView.frame = rect
        
        indicator.center = scrollerView.center
        
        //3,设置scrollerView 的代理方法
        scrollerView.delegate = self
        //设置缩放比例/因子
        scrollerView.minimumZoomScale = 0.5
        scrollerView.maximumZoomScale = 2
    }
    
    //MARK: - 懒加载控件
    
    private lazy var scrollerView = UIScrollView()
    
    
    lazy var imageView = UIImageView()
    // MARK: - 指示器
    private lazy var indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
}

extension PhotoBrowerCell : UIScrollViewDelegate{

    ///  告诉 scrollerView 缩放哪一个视图
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        return imageView
    }
    
    
    ///  缩放完成后会被调用
    ///
    ///  - parameter scrollView: scrollView
    ///  - parameter view:       view - 被缩放的师徒
    ///  - parameter scale:      scale 缩放完成的比例
    func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
                //  调整 Y 值
        var offsetY = (scrollerView.bounds.height - imageView.frame.height) * 0.5
        var offsetX = (scrollView.bounds.width - imageView.frame.width) * 0.5
        
        ///  调整 offsetX  避免 < 0 之后，顶部的内容看不到
        offsetY =  (offsetY < 0) ? 0 : offsetY
        offsetX =  (offsetX < 0) ? 0 : offsetX
        scrollView.contentInset = UIEdgeInsets(top: offsetY, left: offsetX, bottom: 0, right: 0)
        
        printLog(scrollView.contentSize)
    }
    
    ///  只要缩放，就会被调用
    ///
    ///  - parameter scrollView: scrollView
    /**
    
    形变参数小结
    1. a / b 决定 缩放比例
    2. tx / ty  决定位移
    3. a b c d 共同决定循环角度
    
    修改形变的过程，bounds 的数值不会发生变化
    frame 的数组会发生变化 ： bounds * transform ==> frame
    */
    func scrollViewDidZoom(scrollView: UIScrollView) {
    }
}





